package main

import "fmt"

//  有点无聊，  参考 C 结构体， 简单写一次
//  结构体也可以嵌套
type Person struct {
	// 首字母小写 意味着私有， 无法被外部访问， 需要get , set 反射出去
	Name string
	Age  int
	Sex  string
}

func main() {
	// 初始化第一种 引用初始化
	var struct1 Person
	struct1.Name = "张三"
	struct1.Age = 20
	struct1.Sex = "男"
	fmt.Println(struct1)                      // {张三 20 男}
	fmt.Printf("%#v\t%T\n", struct1, struct1) // main.Person{Name:"张三", Age:20, Sex:"男"}      main.Person
	fmt.Println(struct1.Name)                 // 张三

	// 初始化第二种 指针初始化
	var struct2 = new(Person)
	struct2.Name = "李四"
	struct2.Age = 20
	struct2.Sex = "男"
	fmt.Println(struct2)                      // &{李四 20 男}
	fmt.Printf("%#v\t%T\n", struct2, struct2) // &main.Person{Name:"李四", Age:20, Sex:"男"}     *main.Person
	fmt.Println(struct2.Name)                 // 李四

	// 初始化第三种 指针初始化第二种
	var struct3 = &Person{}
	struct3.Name = "王五"
	struct3.Age = 20
	struct3.Sex = "男"
	fmt.Println(struct3)                      // &{王五 20 男}
	fmt.Printf("%#v\t%T\n", struct3, struct3) // &main.Person{Name:"王五", Age:20, Sex:"男"}     *main.Person
	fmt.Println(struct3.Name)                 // 王五

	// 初始化第四种， 键值对初始化
	var struct4 = Person{Name: "赵六", Age: 20, Sex: "女"}
	fmt.Println(struct4)                      // {赵六 20 女}
	fmt.Printf("%#v\t%T\n", struct4, struct4) // main.Person{Name:"赵六", Age:20, Sex:"女"}      main.Person
	fmt.Println(struct4.Name)                 // 赵六

	// 初始化第五种， 指针键值对初始化
	var struct5 = &Person{Name: "钱七", Age: 20, Sex: "女"}
	fmt.Println(struct5)                      // &{钱七 20 女}
	fmt.Printf("%#v\t%T\n", struct5, struct5) // &main.Person{Name:"钱七", Age:20, Sex:"女"}     *main.Person
	fmt.Println(struct5.Name)                 // 钱七
}
